﻿<?
/* 
	Interface para uma tabela utilizadores
	
	Classe Métodos
		Registar
		Login
		Logout
		UpdateUser
		
*/
class users {
	private $t_user;
	private $registry;
		
	function __construct($registry, $tab_users) {
        $this->registry = $registry;
		$this->t_user = $tab_users;
    }
    
    function getUsers_byField($field_value, $field)
    {
    	$sql = "SELECT * from $this->t_user where " . $field . " = '" . $field_value . "'";
		$result = mysql_query($sql);
		// Mysql_num_row is counting table row		
    	if(!$result)
		{
			if(Debug)
				echo  mysql_error() . " @ function getUsers_byField <br />";
			echo 'Por motivos técnicos não foi possível processar o seu pedido, por favor informe o administrador se o erro persistir';
			die();
			exit;
		}
		
        $i = 0;
		$tabela_data = array();
		while($array = mysql_fetch_array($result)){
			array_push($tabela_data, $array);
			$i++;
        }
		
        if($i != 0)
        {
        	$content = Array();
        	$content = $tabela_data;
			return $content;
        } else {
        	return 0;
        }
	}
    
    private function getPais($pais_id)
    {
    	$sql = "SELECT * from paises where id = '" . $pais_id . "'";
		$result = mysql_query($sql);
		// Mysql_num_row is counting table row		
    	if(!$result)
		{
			if(Debug)
				echo  mysql_error() . " @ function getPais <br />";
			echo 'Por motivos técnicos não foi possível processar o seu pedido, por favor informe o administrador se o erro persistir';
			die();
			exit;
		}
		
		//a query dererá retornar unicamente um registo
		if( mysql_num_rows($result) != 1)
		{
			return 0;
		}
		
		//colocar o resultado num array e retorna-lo
		$contents = Array();
		while($row = mysql_fetch_object($result))
		{
			$contents["id"] = $row->id;
			$contents["nome"] = $row->nome;
            $contents["nome_link"] = $row->nome_link;
		}
		
		return $contents;
    }
    
    function getUser_byField($field_value, $field)
    {
    	$sql = "SELECT * from $this->t_user where " . $field . " = '" . $field_value . "'";
		$result = mysql_query($sql);
		// Mysql_num_row is counting table row		
    	if(!$result)
		{
			if(Debug)
				echo  mysql_error() . " @ function getUser_byField <br />";
			echo 'Por motivos técnicos não foi possível processar o seu pedido, por favor informe o administrador se o erro persistir';
			die();
			exit;
		}
		
		//a query dererá retornar unicamente um registo
		if( mysql_num_rows($result) != 1)
		{
			return 0;
		}
		
		//colocar o resultado num array e retorna-lo
		$contents = mysql_fetch_array($result, MYSQL_ASSOC);
		
		return $contents;
    }
	
    /* 		Registar
     * A função valida:
     *
     *   Emails únicos.
     *
     *   A função retorna:
     *   string - com um erro caso este seja detectavel.
     *   0 - se ocorrer um erro na base de dados.
     * 	1 - se operação foi efectuada com sucesso.
     */
    
	function registar($user_data)
	{
		//print_r($user_data);

		if($this->getUser_byField($user_data['email'], 'email') != 0)
		{
			//email já existe
			return 0;
		}
		
		//$user_data['datar'] = time();

		//gerar uma pass para o utilizador
		$passlen = 6;
		$possiblechars = "abcdefghijklmnopqrstuvwxyz";
		$possiblenumbers = "1234567890";
		$code = "";

		//generate random letters
		for($i = 0; $i<$passlen; $i++)
		{
			$code = $code .
			substr($possiblechars, rand(0,strlen($possiblechars) - 1), 1);
		}

		$code = $code . substr($possiblenumbers, rand(0, strlen($possiblenumbers) - 1), 1);
		
		$new_password = md5($code);
		
		$user_data['decoded_pass'] = $code;
		$user_data['pass'] = md5($code);
		$user_data['a_code'] = md5($user_data['email']);

		/*$sql = "LOCK TABLES utilizadores WRITE";	<= So é necessário para transações, o que não é o caso
		$res = mysql_query($sql);
		if(!$res)
		{
			if(Debug)
				echo  mysql_error() . " @ function Registar, Não foi possivel bloquear a tabela <br />";
			return 0;
		}*/
		
		//Dados verificados, inserir os dados.  ---- morada_inicial ---- data_registo ---
		$sql = 'INSERT INTO utilizadores
				(	a_code,
					email,
					primeiro_nome,
					ultimo_nome,
					data_registo,
					password,
					sexo,
					contacto,
				 	data_modificado,
				 	last_login
				 ) Values (
					"' . $user_data['a_code']	. '",
					"'. $user_data['email']		. '",
					"'. $user_data['p_nome']	. '",
					"'. $user_data['u_nome']	. '",
					NOW(),
					"'. $user_data['pass']		. '",
					'. 0				. ',
					"'. $user_data['contacto']	. '",
					NOW(),
					NOW()
				 )';
		//echo $sql;		  
		$res = mysql_query($sql);
		if(!$res)
		{
			if(Debug)
				echo  mysql_error() . " @ function Registar, nao foi possivel adicionar o utilizador <br />";
			echo 'Por motivos técnicos não foi possível processar o seu pedido, por favor informe o administrador se o erro persistir';
			die();
			exit;
			return 0;
		}
		
		/*//Inserir os dados da morada		<=Email é unico, s registou, pdms usa-lo, o ké mt + simples. Ver em bxo
		$result = mysql_query("SELECT MAX(ID) AS LAST_ID FROM $this->t_user");

		$ultimo_id = mysql_fetch_array($result);
		$ultimo_id = $ultimo_id['LAST_ID'];
		if(!$ultimo_id)
		{
			if(Debug)
				echo  mysql_error() . " @ function Registar, get last id <br />";
			echo 'Por motivos técnicos não foi possível processar o seu pedido, por favor informe o administrador se o erro persistir';
			die();
			exit;
			return 0;
		}*/
		
		/*$sql = "UNLOCK TABLES";
		$res = mysql_query($sql);
		if(!$res)
		{
			if(Debug)
				echo  mysql_error() . " @ function Registar, Não foi possivel libertar as tabelas <br />";
			die();
			exit;
			return 0;
		}*/
		
		$user_info = $this->getUser_byField($user_data['email'], 'email');
		$user_info['decoded_pass'] = $user_data['decoded_pass'];
		
		define('EMAIL_REGISTO', $user_info['email']);
		define('EMAIL_PASSWORD', $user_info['decoded_pass']);
		define('CODIGO_ACTIVACAO', $user_info['a_code']);
    		
		require 'nebulae/idiomas/pt/email_registo.php';
    	
		echo EMAIL_ENVIADO;
    	
		return $user_info;
	}
	
	/*   Login 
	* A função valida:
    *
    *   Emails únicos.
    *   Usernames únicos.
    *
    *   A função retorna:
    *   0 - se as credenciais forem incorrectas
    * 	1 - se operação foi efectuada com sucesso.
    */
	function login($email, $password)
	{
		$password = md5($password);
		//email to lower case
		$email = strtolower($email);
		
		$sql="SELECT * FROM $this->t_user WHERE email='$email' and password='$password'";
		
		
		$result=mysql_query($sql);
		
		if(!$result)
		{
			if(Debug)
				echo  mysql_error() . " @ function Registar <br />";
			echo 'Por motivos técnicos não foi possível processar o seu pedido, por favor informe o administrador se o erro persistir';
			die();
			exit;
		}
		
		// Mysql_num_row is counting table row
		$count=mysql_num_rows($result);
		// If result matched $myusername and $mypassword, table row must be 1 row

		if($count==1)
		{
			$dados = mysql_fetch_array($result, MYSQL_ASSOC);
			// Register $myusername, $mypassword and redirect to file "login_success.php"
			session_register("neb_username");
			$_SESSION['neb_username'] = $dados['email'];
			session_register("neb_userid");
			$_SESSION['neb_userid'] = $dados['id'];
			session_register("neb_useremail");
			$_SESSION['neb_useremail'] = $dados['email'];
			session_register("mypassword");
			$_SESSION['neb_password'] = $password;
		} else {
			return 0;
		}
		
		//$my_stats = $this->registry['db']->get_unico_by_query("utilizador_info", "select * from utilizador_info where id='" . $dados['id'] . "'");
		//print_r($my_stats);
		
		$sql="UPDATE $this->t_user set login_count= login_count + 1 ,last_login='" . date('Y-m-d \- H:i:s') . "'  WHERE id='" . $dados['id'] . "'";
		$result=mysql_query($sql);
		
		if(!$result)
		{
			if(Debug)
				echo  mysql_error() . " @ function login stats() <br />";
			echo 'Por motivos técnicos não foi possível processar o seu pedido, por favor informe o administrador se o erro persistir';
			die();
			exit;
		}
		
		
		//alterar login count
		//alterar data ultimo login
		return 1;
	}
	
	
	function activar($a_code)
	{
		$sql="UPDATE $this->t_user SET activado='1' WHERE a_code='$a_code' and activado='0'";
		$result=mysql_query($sql);
		if(!$result)
		{
			if(Debug)
				echo  mysql_error() . " @ function Activar <br />";
			return 0;
		}
		
		if(mysql_affected_rows() != 1)
		{
			return 0;
		}
		
		
		return $this->getUser_byField($a_code, 'a_code');
	}
	
	
	function password_reset($my_email)
	{
		
		//fetch user by e-mail
		$user_data = $this->getUser_byField($my_email, 'email');
		if(!$user_data)
		{
			return;
		}
		
		//gerar uma pass para o utilizador
		$passlen = 6;
		$possiblechars = "abcdefghijklmnopqrstuvwxyz";
		$possiblenumbers = "1234567890";
		$code = "";

		//generate random letters
		for($i = 0; $i<$passlen; $i++){
   			$code = $code .
			substr($possiblechars,rand(0,strlen($possiblechars)-1),1);
		}
		
		$code = $code . substr($possiblenumbers,rand(0,strlen($possiblenumbers)-1),1);
		
		$new_password = md5($code);
		$sql="UPDATE $this->t_user SET password='$new_password' WHERE id='" . $user_data['id'] ."'";
		$result=mysql_query($sql);
		if(!$result)
		{
			if(Debug)
				echo  mysql_error() . " @ function Recuperar, não foi possivel definir a nova password <br />";
			return 0;
		}
		
		if(mysql_affected_rows() != 1)
		{
			return;
		}
		
		$user_info = $this->getUser_byField($my_email, 'email');
		
		define('PASSWORD_RESET_EMAIL_UTILIZADOR', $user_info['email']);
    	define('PASSWORD_RESET_NEW_DECODED_PASS', $code);
    		
    	require 'nebulae/idiomas/pt/email_reset.php';
		
    	echo EMAIL_ENVIADO;
    	
		return 1;
		
	}
	
	function changepassword($user_id, $old_pass, $new_pass)
	{
		$password = md5($old_pass);
		
		
		$sql="SELECT * FROM $this->t_user WHERE id='$user_id' and pass='$password'";
		$result=mysql_query($sql);
		
		if(!$result)
		{
			return 0;
		}
		
		// Mysql_num_row is counting table row
		$count=mysql_num_rows($result);
		// If result matched $myusername and $mypassword, table row must be 1 row

		if($count==1)
		{
			$password = md5($new_pass);
			$sql="UPDATE $this->t_user SET pass='" . $password . "' WHERE id='$user_id'";
			$result=mysql_query($sql);
		
			if(!$result)
			{
				if(Debug)
					echo  mysql_error() . " @ function changePassword <br />";
				echo 'Por motivos técnicos não foi possível processar o seu pedido, por favor informe o administrador se o erro persistir';
				die();
				exit;
			}
			
			$_SESSION['neb_password'] = $password;
		} else {
			return 0;
		}
		
		
		return 1;
	}

	function update($my_id, $data)
	{
		$data['data_modificado'] = date('Y-m-d \- H:i:s');
		
		//Dados verificados, inserir os dados.  ---- morada_inicial ---- data_registo ---
		$sql = "UPDATE " . $this->t_user . " SET " .  
				"sexo='" . $data['sexo'] . "', " .
				"primeiro_nome='" . $data['primeiro_nome'] . "', " .
				"ultimo_nome='" . $data['ultimo_nome'] . "', " .
				"contacto='" . $data['contacto'] . "', " .
				"data_modificado='" . $data['data_modificado'] . "', " .
				"obs='" . $data['obs'] . "' " .
				"WHERE id='" . $my_id . "'"; 
		
		//echo $sql;		  
		$res = mysql_query($sql);
		if(!$res)
		{
			if(Debug)
				echo  mysql_error() . " @ function Registar, nao foi possivel adicionar o utilizador <br />";
			echo 'Por motivos tÃ©cnicos nÃ£o foi possÃ­vel processar o seu pedido, por favor informe o administrador se o erro persistir';
			die();
			exit;
			return 0;
		}
		
		return $my_id;
	}
}	
?>